#include "espionaje.h"

void Espionaje::llenarFila(int f,fstream& fila,Matriz* m)
{
	string numero;
	for(Tam j=1;j<=m->cantidadDeColumnas();j++)
	{
		fila>>numero;
		m->set(f,j,atof(numero.c_str()));
	}
}

void Espionaje::escribirFila(int f,fstream& fila,Matriz* m)
{
	for(Tam j=1;j<=m->cantidadDeColumnas();j++)
	{
		fila<<m->get(f,j);
		fila<<' ';
	}
	fila<<endl;
}

Espionaje::Espionaje(char* d,char* disp)
{
	_posicion=NULL;
	_impacto=NULL;
	_transEnemigo=NULL;
	_nuestraTransformacion=NULL;
	_nuestroDisparo=NULL;
	_fileDatos.open(d);
	_fileDisparo.open(disp,ios::out);
	_fileDatos>>_turno;
	_fileDatos>>_dimension;
	_posicion = new Matriz(1,_dimension);

	if(_turno == 0)
	{
		llenarFila(1,_fileDatos,_posicion);
		_info.open(INFO,ios::out);
		escribirFila(1,_info,_posicion);
		_info.close();
	}

	else
	{
		_impacto = new Matriz(1,_dimension);
		_transEnemigo = new Matriz(_dimension,_dimension);
		llenarFila(1,_fileDatos,_impacto);
		for(Tam i=1;i<=_dimension;i++)
			llenarFila(i,_fileDatos,_transEnemigo);
		_info.open(INFO);
		llenarFila(1,_info,_posicion);
		_info.close();
        _impacto->trasponer();
		//levantar datos auxiliares si es que los hay!!!
	}
	_posicion->trasponer();
}
int Espionaje::getDimension() const
{
	return _dimension;
}

int Espionaje::getTurno() const
{
	return _turno;
}

Matriz* Espionaje::getPosicionNuestra() const
{
	return _posicion;
}
Matriz* Espionaje::getPosicionImpacto() const
{
	return _impacto;
}

Matriz* Espionaje::getMatrizEnemigo() const
{
	return _transEnemigo;
}

void Espionaje::escibirInformacionAdicional()
{
	_info.open(INFO,ios::out | ios::app);
	escribirFila(1,_info,_impacto);
	_info.close();
}

void Espionaje::escribirDisparo()
{
	_fileDisparo<<_turno+1<<endl;
	_fileDisparo<<_dimension<<endl;

	for(Tam j=1;j<=_dimension;j++)
		_fileDisparo<<_nuestroDisparo->get(j,1)<<' ';
	_fileDisparo<<endl;

	for(Tam i=1;i<=_dimension;i++)
	{
		for(Tam j=1;j<=_dimension;j++)
			_fileDisparo<<_nuestraTransformacion->get(i,j)<<' ';
		_fileDisparo<<endl;
	}
}

void Espionaje::setDisparo(const Matriz* disparo)
{
	_nuestroDisparo = new Matriz(disparo->cantidadDeFilas(),disparo->cantidadDeColumnas());
	_nuestroDisparo->copiarMatriz(disparo);
}

void Espionaje::setTransformacion(const Matriz* transformacion)
{
	_nuestraTransformacion = new Matriz(transformacion->cantidadDeFilas(),transformacion->cantidadDeColumnas());
	_nuestraTransformacion->copiarMatriz(transformacion);
}

Espionaje::~Espionaje()
{
	_fileDatos.close();
	_fileDisparo.close();
	if(!_posicion)
		delete _posicion;
	if(!_impacto)
		delete _impacto;
	if(!_transEnemigo)
		delete _transEnemigo;
	if(!_nuestraTransformacion)
		delete _nuestraTransformacion;
	if(!_nuestroDisparo)
		delete _nuestroDisparo;
}
